home *** CD-ROM | disk | FTP | other *** search
/ ftp.cs.arizona.edu / ftp.cs.arizona.edu.tar / ftp.cs.arizona.edu / icon / newsgrp / group00a.txt / 000017_icon-group-sender _Mon Jan 31 14:09:03 2000.msg < prev    next >
Internet Message Format  |  2001-01-03  |  4KB

  1. Return-Path: <icon-group-sender>
  2. Received: (from root@localhost)
  3.     by baskerville.CS.Arizona.EDU (8.9.1a/8.9.1) id OAA07066
  4.     for icon-group-addresses; Mon, 31 Jan 2000 14:07:28 -0700 (MST)
  5. Message-Id: <200001312107.OAA07066@baskerville.CS.Arizona.EDU>
  6. Date: Mon, 31 Jan 2000 13:50:15 -0600
  7. From: "Charles Hethcoat" <CHETHCOA@oss.oceaneering.com>
  8. To: <icon-group@optima.CS.Arizona.EDU>
  9. Subject: Updating array parameters in Icon (a mini-dissertation)
  10. Content-Disposition: inline
  11. X-Guinevere: 1.0.12 ; Oceaneering Int'l
  12. X-MIME-Autoconverted: from quoted-printable to 8bit by baskerville.CS.Arizona.EDU id MAA04310
  13. Errors-To: icon-group-errors@optima.CS.Arizona.EDU
  14. Status: RO
  15.  
  16. I have an Icon programming problem that needs clarification, but I
  17. suspect many Icon programmers can benefit from what I've found out about
  18. it so far.
  19.  
  20. BACKGROUND
  21.  
  22. I have from time to time needed to write a procedure that returns a list
  23. as its value. Example:
  24.  
  25. list_value := func_1()
  26.  
  27. However, sometimes the list is an update of values in an already
  28. existing list. This occurs frequently in numerical analysis. Example:
  29.  
  30. list_value := list(1, 10)        # Creating the list
  31. ...
  32. list_value := func_2(list_value)    # Returning a new list
  33.  
  34. The returned value of func_2() is based on a computation using the
  35. initial value of list_value as input to an algorithm that calculates a
  36. vector of deltas and adds them to the original list.  This updated list
  37. is the function result.
  38.  
  39. But once in a while it turns out that another value is a better
  40. candidate for the returned value. The list in question then becomes a
  41. parameter to the procedure. Example:
  42.  
  43. list_value := list(1, 10)        # Creating the list
  44. ...
  45. if func_3(list_value) then        # Updating the list
  46.     # success:
  47.     x := list_value[1] # (x ~= 1)    # Using the list
  48. else
  49.     # failure case...
  50.  
  51. Here, func_3() updates the list_value parameter, sets some return value,
  52. and returns, so that the updated list is ready for further use.
  53.  
  54. I knew that a scalar value, when assigned to a parameter inside a
  55. procedure, would not survive return to the caller. I also knew that a
  56. record data structure could be so updated. (I have even hidden a scalar
  57. value inside a record to get around this restriction.) But I wasn't sure
  58. about lists. I noticed that sometimes the list would come back updated,
  59. and sometimes it wouldn't.
  60.  
  61. STRANGE BEAST ISOLATED IN CAPTIVITY!
  62.  
  63. I finally discovered that a list parameter can indeed be updated, but
  64. you have to update it in a certain way. I wrote the following program to
  65. illustrate the problem and the solution:
  66.  
  67. ========8<==================8<====================
  68. # Verify behavior of updated list parameters
  69. procedure main()
  70.     local x, y
  71.     x := []
  72.     y := []
  73.  
  74.     write("Before updating:")
  75.     write("x[1] = >", (x[1] | "empty"), "<")
  76.     write("y[1] = >", (y[1] | "empty"), "<")
  77.  
  78.     method1(x)
  79.     method2(y)
  80.  
  81.     write("After updating:")
  82.     write("x[1] = >", (x[1] | "empty"), "<")
  83.     write("y[1] = >", (y[1] | "empty"), "<")
  84.     exit()
  85. end
  86.  
  87. # method1 - assign a new list value to the parameter
  88. procedure method1(x)
  89.     x := [&e]
  90.     return
  91. end
  92.  
  93. # method2 - put a new value on the existing list
  94. procedure method2(x)
  95.     put(x, &pi)
  96.     return
  97. end
  98. ========8<==================8<====================
  99.  
  100. The output of this program is
  101.  
  102. ========8<==================8<====================
  103. Before updating:
  104. x[1] = >empty<
  105. y[1] = >empty<
  106. After updating:
  107. x[1] = >empty<
  108. y[1] = >3.141592653589793<
  109. ========8<==================8<====================
  110.  
  111. QUESTION
  112.  
  113. I suspect that the answer has to do with the pointer semantics of Icon,
  114. but if anyone can flesh this out for me I'd appreciate it.  Meanwhile,
  115. maybe some will find this a useful programming tip.
  116.  
  117. Thanks in advance,
  118.  
  119. Charles Hethcoat
  120. Sr. Engineer
  121. Oceaneering Space Systems
  122. Houston, TX 77058 USA
  123.  
  124.